package org.example.DongTaiProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/*
*
*   动态代理流程：
*       1. 创建动态代理类,实现InvocationHandler接口
*       2. 覆盖InvocationHandler接口中的invoke方法
*       3. 写成员变量 -- zs (真实实现类)
*       4. 完成invoke方法
*
* */

public class MyInvocationHandler implements InvocationHandler {
    Object target;// 真实实现类zs

    public MyInvocationHandler(Object target) {
        this.target = target;
    }

    /*
    *
    *   这个invoke方法就是送花案例中代理类李四的送花业务
    *   (1) 通过成员变量zs,实现真实实现类的核心业务
    *   (2) 对于业务的增强
    *
    *   @param proxy --- 代理类对象
    *   @param method --- zs(真实实现类)的核心业务方法
    *   @param args --- zs(真实实现类)的核心业务方法需要的参数
    *
    * */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        /*
        *   对象 target
        *   方法 method
        *   实参 args
        * */
        System.out.println("记录日志开始");// 增强业务,以写日志为例
        Object o = method.invoke(target, args);// 实现真是实现类的核心业务
        System.out.println("记录日志结束");// 增强业务
        return o;
    }
}
